home *** CD-ROM | disk | FTP | other *** search
/ Delphi Anthology / aDELPHI.iso / Runimage / Delphi50 / Source / Property Editors / adoreg.pas < prev    next >
Pascal/Delphi Source File  |  1999-08-11  |  31KB  |  1,115 lines

  1.  
  2. {*******************************************************}
  3. {                                                       }
  4. {       Borland Delphi Visual Component Library         }
  5. {       ADO Component Registration                      }
  6. {                                                       }
  7. {       Copyright (c) 1999 Inprise Corporation          }
  8. {                                                       }
  9. {*******************************************************}
  10.  
  11. unit ADOReg;
  12.  
  13. interface
  14.  
  15. uses
  16.   SysUtils, Classes, Forms, Controls,
  17.   FldLinks, CustomModuleEditors,
  18.   ParentageSupport, DsnDB, ModelViews, ModelPrimitives,
  19.   DataModelViews, DataModelSupport,
  20.   DB, DsgnIntf, DSNDBCST, DBReg, ColnEdit, ADODB;
  21.  
  22. type
  23.  
  24. { Property Editors }
  25.  
  26. { TProviderProperty }
  27.  
  28.   TProviderProperty = class(TDBStringProperty)
  29.   public
  30.     procedure GetValueList(List: TStrings); override;
  31.   end;
  32.  
  33. { TConnectionStringProperty }
  34.  
  35.   TConnectionStringProperty = class(TStringProperty)
  36.   public
  37.     function GetAttributes: TPropertyAttributes; override;
  38.     procedure Edit; override;
  39.   end;
  40.  
  41. { TCommandTextProperty }
  42.  
  43.   TCommandTextProperty = class(TDBStringProperty)
  44.   private
  45.     FCommandType: TCommandType;
  46.     FConnection: TADOConnection;
  47.   public
  48.     procedure Activate; override;
  49.     function AutoFill: Boolean; override;
  50.     procedure Edit; override;
  51.     procedure EditSQLText; virtual;
  52.     function GetAttributes: TPropertyAttributes; override;
  53.     function GetConnection(Opened: Boolean): TADOConnection;
  54.     procedure GetValueList(List: TStrings); override;
  55.     property CommandType: TCommandType read FCommandType write FCommandType;
  56.   end;
  57.  
  58. { TTableNameProperty }
  59.  
  60.   TTableNameProperty = class(TCommandTextProperty)
  61.   public
  62.     procedure Activate; override;
  63.   end;
  64.  
  65. { TProcedureNameProperty }
  66.  
  67.   TProcedureNameProperty = class(TCommandTextProperty)
  68.   public
  69.     procedure Activate; override;
  70.   end;
  71.  
  72. { TParametersProperty }
  73.  
  74.   TParametersProperty = class(TCollectionProperty)
  75.   public
  76.     procedure Edit; override;
  77.   end;
  78.  
  79. { TADODataSetFieldLinkProperty }
  80.  
  81.   TADODataSetFieldLinkProperty = class(TFieldLinkProperty)
  82.   private
  83.     FADODataSet: TADODataSet;
  84.   protected
  85.     function GetIndexFieldNames: string; override;
  86.     function GetMasterFields: string; override;
  87.     procedure SetIndexFieldNames(const Value: string); override;
  88.     procedure SetMasterFields(const Value: string); override;
  89.   public
  90.     procedure Edit; override;
  91.   end;
  92.  
  93. { TADOTableFieldLinkProperty }
  94.  
  95.   TADOTableFieldLinkProperty = class(TFieldLinkProperty)
  96.   private
  97.     FTable: TADOTable;
  98.   protected
  99.     function GetIndexFieldNames: string; override;
  100.     function GetMasterFields: string; override;
  101.     procedure SetIndexFieldNames(const Value: string); override;
  102.     procedure SetMasterFields(const Value: string); override;
  103.   public
  104.     procedure Edit; override;
  105.   end;
  106.  
  107. { TADOIndexNameProperty }
  108.  
  109.   TADOIndexNameProperty = class(TDBStringProperty)
  110.   public
  111.     procedure GetValueList(List: TStrings); override;
  112.   end;
  113.   
  114. { Component Editors }
  115.  
  116. { TADOConnectionEditor }
  117.  
  118.   TADOConnectionEditor = class(TComponentEditor)
  119.   public
  120.     procedure ExecuteVerb(Index: Integer); override;
  121.     function GetVerb(Index: Integer): string; override;
  122.     function GetVerbCount: Integer; override;
  123.   end;
  124.  
  125. { TADOCommandEditor }
  126.  
  127.   TADOCommandEditor = class(TComponentEditor)
  128.   public
  129.     procedure ExecuteVerb(Index: Integer); override;
  130.     function GetVerb(Index: Integer): string; override;
  131.     function GetVerbCount: Integer; override;
  132.   end;
  133.  
  134. { TADODataSetEditor }
  135.  
  136.   TADODataSetEditor = class(TDataSetEditor)
  137.   private
  138.     FCanCreate: Boolean;
  139.   public
  140.     procedure ExecuteVerb(Index: Integer); override;
  141.     function GetVerb(Index: Integer): string; override;
  142.     function GetVerbCount: Integer; override;
  143.   end;
  144.  
  145. { Data Module Designer Support }
  146.  
  147. const
  148.   cConnectionSprigPrefix = '<ImpliedConnection>'; { do not localize }
  149.  
  150. type
  151.   TADOConnectionSprig = class(TSprigAtRoot)
  152.   public
  153.     function AnyProblems: Boolean; override;
  154.     function Caption: string; override;
  155.   end;
  156.  
  157.   TADOImpliedConnectionSprig = class(TSprigAtRoot)
  158.   private
  159.     FConnectionString: string;
  160.   public
  161.     function AnyProblems: Boolean; override;
  162.     function UniqueName: string; override;
  163.     function Caption: string; override;
  164.     function Transient: Boolean; override;
  165.     function ItemClass: TClass; override;
  166.   end;
  167.  
  168.   TRDSConnectionSprig = class(TSprigAtRoot)
  169.   end;
  170.  
  171.   TADOCommandSprig = class(TSprig)
  172.   public
  173.     procedure FigureParent; override;
  174.     function DragDropTo(AItem: TSprig): Boolean; override;
  175.     function DragOverTo(AItem: TSprig): Boolean; override;
  176.     function AnyProblems: Boolean; override;
  177.     class function PaletteOverTo(AParent: TSprig; AClass: TClass): Boolean; override;
  178.     function Caption: string; override;
  179.   end;
  180.  
  181.   TADOCommandIsland = class(TIsland)
  182.   public
  183.     function VisibleTreeParent: Boolean; override;
  184.   end;
  185.  
  186.   TCustomADODataSetSprig = class(TDataSetSprig)
  187.   public
  188.     procedure FigureParent; override;
  189.     function AnyProblems: Boolean; override;
  190.     function DragDropTo(AItem: TSprig): Boolean; override;
  191.     function DragOverTo(AItem: TSprig): Boolean; override;
  192.     class function PaletteOverTo(AParent: TSprig; AClass: TClass): Boolean; override;
  193.   end;
  194.  
  195.   TADODataSetSprig = class(TCustomADODataSetSprig)
  196.   public
  197.     procedure FigureParent; override;
  198.     function AnyProblems: Boolean; override;
  199.     function DragDropTo(AItem: TSprig): Boolean; override;
  200.     function DragOverTo(AItem: TSprig): Boolean; override;
  201.     class function PaletteOverTo(AParent: TSprig; AClass: TClass): Boolean; override;
  202.     function Caption: string; override;
  203.   end;
  204.  
  205.   TADOTableSprig = class(TCustomADODataSetSprig)
  206.   public
  207.     function AnyProblems: Boolean; override;
  208.     function Caption: string; override;
  209.   end;
  210.  
  211.   TADOStoredProcSprig = class(TCustomADODataSetSprig)
  212.   public
  213.     function AnyProblems: Boolean; override;
  214.     function Caption: string; override;
  215.   end;
  216.  
  217.   TADOQuerySprig = class(TCustomADODataSetSprig)
  218.   public
  219.     function AnyProblems: Boolean; override;
  220.   end;
  221.  
  222.   TCustomADODataSetIsland = class(TIsland)
  223.   public
  224.     function VisibleTreeParent: Boolean; override;
  225.   end;
  226.  
  227.   TADODataSetIsland = class(TCustomADODataSetIsland)
  228.   end;
  229.  
  230.   TADOTableIsland = class(TCustomADODataSetIsland)
  231.   end;
  232.  
  233.   TADOQueryIsland = class(TCustomADODataSetIsland)
  234.   end;
  235.  
  236.   TCustomADODataSetMasterDetailBridge = class(TMasterDetailBridge)
  237.   public
  238.     class function GetOmegaSource(AItem: TPersistent): TDataSource; override;
  239.     class procedure SetOmegaSource(AItem: TPersistent; ADataSource: TDataSource); override;
  240.     function Caption: string; override;
  241.   end;
  242.  
  243.   TADODataSetMasterDetailBridge = class(TCustomADODataSetMasterDetailBridge)
  244.   public
  245.     function CanEdit: Boolean; override;
  246.     function Edit: Boolean; override;
  247.     class function OmegaIslandClass: TIslandClass; override;
  248.   end;
  249.  
  250.   TADOTableMasterDetailBridge = class(TCustomADODataSetMasterDetailBridge)
  251.   public
  252.     function CanEdit: Boolean; override;
  253.     function Edit: Boolean; override;
  254.     class function OmegaIslandClass: TIslandClass; override;
  255.   end;
  256.  
  257.   TADOQueryMasterDetailBridge = class(TCustomADODataSetMasterDetailBridge)
  258.   public
  259.     class function OmegaIslandClass: TIslandClass; override;
  260.   end;
  261.  
  262. procedure Register;
  263.  
  264. implementation
  265.  
  266. uses TypInfo, ADOConEd, Consts, SQLEdit, Dialogs;
  267.  
  268. { Utility functions }
  269.  
  270. function EditFileName(ADataSet: TADODataSet; LoadData: Boolean): Boolean;
  271. begin
  272.   with TOpenDialog.Create(nil) do
  273.   try
  274.     Title := sOpenFileTitle;
  275.     DefaultExt := 'adtg';
  276.     Filter := SADODataFilter;
  277.     Result := Execute;
  278.     if Result then
  279.       if LoadData then
  280.         ADataSet.LoadFromFile(FileName) else
  281.         ADataSet.CommandText := FileName;
  282.   finally
  283.     Free;
  284.   end;
  285. end;
  286.  
  287. procedure SaveToFile(ADataSet: TADODataSet);
  288. var
  289.   PersistFormat: TPersistFormat;
  290. begin
  291.   with TSaveDialog.Create(nil) do
  292.   try
  293.     Options := [ofOverwritePrompt];
  294.     DefaultExt := 'adtg';
  295.     Filter := SADODataFilter;
  296.     if Execute then
  297.     begin
  298.       if FilterIndex = 2 then
  299.         PersistFormat := pfXML else
  300.         PersistFormat := pfADTG;
  301.       ADataSet.SaveToFile(FileName, PersistFormat);
  302.     end;
  303.   finally
  304.     Free;
  305.   end;
  306. end;
  307.  
  308. { TProviderProperty }
  309.  
  310. procedure TProviderProperty.GetValueList(List: TStrings);
  311. begin
  312.   GetProviderNames(List);
  313. end;
  314.  
  315. { TConnectionStringProperty }
  316.  
  317. function TConnectionStringProperty.GetAttributes: TPropertyAttributes;
  318. begin
  319.   Result := [paDialog];
  320. end;
  321.  
  322. procedure TConnectionStringProperty.Edit;
  323. begin
  324.   if EditConnectionString(GetComponent(0) as TComponent) then
  325.     Modified;
  326. end;
  327.  
  328. { TCommandTextProperty }
  329.  
  330. function TCommandTextProperty.GetAttributes: TPropertyAttributes;
  331. begin
  332.   if CommandType in [cmdTable, cmdTableDirect, cmdStoredProc] then
  333.     Result := [paValueList, paSortList, paMultiSelect] else {Drop down list for name list}
  334.     Result := [paMultiSelect, paRevertable, paDialog]; {SQL or File}
  335. end;
  336.  
  337. procedure TCommandTextProperty.Activate;
  338. var
  339.   PropInfo: PPropInfo;
  340.   Component: TComponent;
  341. begin
  342.   Component := GetComponent(0) as TComponent;
  343.   PropInfo := TypInfo.GetPropInfo(Component.ClassInfo, 'CommandType'); { do not localize }
  344.   if Assigned(PropInfo) then
  345.     CommandType := TCommandType(GetOrdProp(Component, PropInfo)) else
  346.     CommandType := cmdText;
  347. end;
  348.  
  349. procedure TCommandTextProperty.EditSQLText;
  350. var
  351.   Command: string;
  352.   Connection: TADOConnection;
  353. begin
  354.   if paDialog in GetAttributes then
  355.   begin
  356.     Command := GetStrValue;
  357.     Connection := GetConnection(True);
  358.     try
  359.       if EditSQL(Command, Connection.GetTableNames, Connection.GetFieldNames) then
  360.         SetStrValue(Command);
  361.     finally
  362.       FConnection.Free;
  363.       FConnection := nil;
  364.     end;
  365.   end;
  366. end;
  367.  
  368. procedure TCommandTextProperty.Edit;
  369. begin
  370.   case CommandType of
  371.     cmdText, cmdUnknown: EditSQLText;
  372.     cmdFile: EditFileName(GetComponent(0) as TADODataSet, False);
  373.   else
  374.     inherited;
  375.   end;
  376. end;
  377.  
  378. function TCommandTextProperty.GetConnection(Opened: Boolean): TADOConnection;
  379. var
  380.   Component: TComponent;
  381.   ConnectionString: string;
  382. begin
  383.   Component := GetComponent(0) as TComponent;
  384.   Result := TObject(GetOrdProp(Component, TypInfo.GetPropInfo(Component.ClassInfo,
  385.     'Connection'))) as TADOConnection; { do not localize }
  386.   if not Opened then Exit;
  387.   if not Assigned(Result) then
  388.   begin
  389.     ConnectionString := TypInfo.GetStrProp(Component,
  390.       TypInfo.GetPropInfo(Component.ClassInfo, 'ConnectionString')); { do not localize }
  391.     if ConnectionString = '' then Exit;
  392.     FConnection := TADOConnection.Create(nil);
  393.     FConnection.ConnectionString := ConnectionString;
  394.     FConnection.LoginPrompt := False;
  395.     Result := FConnection;
  396.   end;
  397.   Result.Open;
  398. end;
  399.  
  400. procedure TCommandTextProperty.GetValueList(List: TStrings);
  401. var
  402.   Connection: TADOConnection;
  403. begin
  404.   Connection := GetConnection(True);
  405.   if Assigned(Connection) then
  406.   try
  407.     case CommandType of
  408.       cmdTable, cmdTableDirect:
  409.         Connection.GetTableNames(List);
  410.       cmdStoredProc:
  411.         Connection.GetProcedureNames(List);
  412.     end;
  413.   finally
  414.     FConnection.Free;
  415.     FConnection := nil;
  416.   end;
  417. end;
  418.  
  419. function TCommandTextProperty.AutoFill: Boolean;
  420. var
  421.   Connection: TADOConnection;
  422. begin
  423.   Connection := GetConnection(False);
  424.   Result := Assigned(Connection) and Connection.Connected;
  425. end;
  426.  
  427. { TTableNameProperty }
  428.  
  429. procedure TTableNameProperty.Activate;
  430. begin
  431.   CommandType := cmdTable;
  432. end;
  433.  
  434. { TProcedureNameProperty }
  435.  
  436. procedure TProcedureNameProperty.Activate;
  437. begin
  438.   CommandType := cmdStoredProc;
  439. end;
  440.  
  441.  
  442. { TParametersProperty }
  443.  
  444. procedure TParametersProperty.Edit;
  445. var
  446.   Parameters: TParameters;
  447. begin
  448.   try
  449.     Parameters := TParameters(GetOrdValue);
  450.     if Parameters.Count = 0 then Parameters.Refresh;
  451.   except
  452.     { Ignore any error when trying to refresh the params }
  453.   end;
  454.   inherited Edit;
  455. end;
  456.  
  457. { TADODataSetFieldLinkProperty }
  458.  
  459. procedure TADODataSetFieldLinkProperty.Edit;
  460. begin
  461.   FADODataSet := DataSet as TADODataSet;
  462.   inherited Edit;
  463. end;
  464.  
  465. function TADODataSetFieldLinkProperty.GetIndexFieldNames: string;
  466. begin
  467.   Result := FADODataSet.IndexFieldNames;
  468. end;
  469.  
  470. function TADODataSetFieldLinkProperty.GetMasterFields: string;
  471. begin
  472.   Result := FADODataSet.MasterFields;
  473. end;
  474.  
  475. procedure TADODataSetFieldLinkProperty.SetIndexFieldNames(const Value: string);
  476. begin
  477.   FADODataSet.IndexFieldNames := Value;
  478. end;
  479.  
  480. procedure TADODataSetFieldLinkProperty.SetMasterFields(const Value: string);
  481. begin
  482.   FADODataSet.MasterFields := Value;
  483. end;
  484.  
  485. { TADOTableFieldLinkProperty }
  486.  
  487. procedure TADOTableFieldLinkProperty.Edit;
  488. begin
  489.   FTable := DataSet as TADOTable;
  490.   inherited Edit;
  491. end;
  492.  
  493. function TADOTableFieldLinkProperty.GetIndexFieldNames: string;
  494. begin
  495.   Result := FTable.IndexFieldNames;
  496. end;
  497.  
  498. function TADOTableFieldLinkProperty.GetMasterFields: string;
  499. begin
  500.   Result := FTable.MasterFields;
  501. end;
  502.  
  503. procedure TADOTableFieldLinkProperty.SetIndexFieldNames(const Value: string);
  504. begin
  505.   FTable.IndexFieldNames := Value;
  506. end;
  507.  
  508. procedure TADOTableFieldLinkProperty.SetMasterFields(const Value: string);
  509. begin
  510.   FTable.MasterFields := Value;
  511. end;
  512.  
  513. { TADOIndexNameProperty }
  514.  
  515. procedure TADOIndexNameProperty.GetValueList(List: TStrings);
  516. var
  517.   IndexDefs: TIndexDefs;
  518. begin
  519.   if GetComponent(0) is TADODataSet then
  520.     IndexDefs := TADODataSet(GetComponent(0)).IndexDefs
  521.   else
  522.     IndexDefs := TADOTable(GetComponent(0)).IndexDefs;
  523.   IndexDefs.Updated := False;
  524.   IndexDefs.Update;
  525.   IndexDefs.GetItemNames(List);
  526. end;
  527.  
  528. { TADOConnectionEditor }
  529.  
  530. procedure TADOConnectionEditor.ExecuteVerb(Index: Integer);
  531. var
  532.   I: Integer;
  533. begin
  534.   I := inherited GetVerbCount;
  535.   if Index < I then inherited else
  536.   begin
  537.     case Index - I of
  538.       0: if EditConnectionString(Component) then Designer.Modified;
  539.     end;
  540.   end;
  541. end;
  542.  
  543. function TADOConnectionEditor.GetVerb(Index: Integer): string;
  544. var
  545.   I: Integer;
  546. begin
  547.   I := inherited GetVerbCount;
  548.   if Index < I then Result := inherited GetVerb(Index) else
  549.     case Index - I of
  550.       0: Result := SADOConnectionEditor;
  551.     end;
  552. end;
  553.  
  554. function TADOConnectionEditor.GetVerbCount: Integer;
  555. begin
  556.   Result := inherited GetVerbCount + 1;
  557. end;
  558.  
  559.  
  560. { TADOCommandEditor }
  561.  
  562. procedure TADOCommandEditor.ExecuteVerb(Index: Integer);
  563. var
  564.   I: Integer;
  565. begin
  566.   I := inherited GetVerbCount;
  567.   if Index < I then inherited else
  568.   begin
  569.     case Index - I of
  570.       0: TADOCommand(Component).Execute;
  571.     end;
  572.   end;
  573. end;
  574.  
  575. function TADOCommandEditor.GetVerb(Index: Integer): string;
  576. var
  577.   I: Integer;
  578. begin
  579.   I := inherited GetVerbCount;
  580.   if Index < I then Result := inherited GetVerb(Index) else
  581.     case Index - I of
  582.       0: Result := SCommandExecute;
  583.     end;
  584. end;
  585.  
  586. function TADOCommandEditor.GetVerbCount: Integer;
  587. begin
  588.   Result := inherited GetVerbCount;
  589.   if TADOCommand(Component).CommandText <> '' then
  590.      Inc(Result);
  591. end;
  592.  
  593. { TADODataSetEditor }
  594.  
  595. procedure TADODataSetEditor.ExecuteVerb(Index: Integer);
  596. begin
  597.   if Index <= inherited GetVerbCount - 1 then
  598.     inherited ExecuteVerb(Index) else
  599.   begin
  600.     Dec(Index, inherited GetVerbCount);
  601.     if (Index > 0) and not FCanCreate then Inc(Index);
  602.     case Index of
  603.       0: begin
  604.            EditFileName(Component as TADODataSet, True);
  605.            Designer.Modified;
  606.          end;
  607.       1: begin
  608.            TADODataSet(Component).CreateDataSet;
  609.            Designer.Modified;
  610.          end;
  611.       2: SaveToFile(Component as TADODataSet);
  612.     end;
  613.   end;
  614. end;
  615.  
  616. function TADODataSetEditor.GetVerb(Index: Integer): string;
  617. begin
  618.   if Index <= inherited GetVerbCount - 1 then
  619.     Result := inherited GetVerb(Index) else
  620.   begin
  621.     Dec(Index, inherited GetVerbCount);
  622.     if (Index > 0) and not FCanCreate then Inc(Index);
  623.     case Index of
  624.       0: Result := SLoadFromFile;
  625.       1: Result := SCreateDataSet;
  626.       2: Result := SSaveToFile;
  627.     end;
  628.   end;
  629. end;
  630.  
  631. function TADODataSetEditor.GetVerbCount: Integer;
  632. begin
  633.   Result := inherited GetVerbCount + 1; { LoadFromFile }
  634.   with TADODataSet(Component) do
  635.   begin
  636.     FCanCreate := not Active and ((FieldCount > 0) or (FieldDefs.Count > 0));
  637.     { either CreateDataSet or SaveToFile (but never both) }
  638.     if FCanCreate or Active then Inc(Result);
  639.   end;
  640. end;
  641.  
  642.  
  643. { Data Module Designer Support }
  644.  
  645. const
  646.   cCommandTypes: array [TCommandType] of string = ('Unknown', 'Text', 'Table', { Do not localize }
  647.                                                    'StoredProc', 'File', { Do not localize }
  648.                                                    'TableDirect'); { Do not localize }
  649.  
  650. function SprigADOImpliedConnectionName(const AName: string): string;
  651. begin
  652.   Result := Format('%s.%s', [cConnectionSprigPrefix, AName]); { do not localize }
  653. end;
  654.  
  655. { TADOConnectionSprig }
  656.  
  657. function TADOConnectionSprig.AnyProblems: Boolean;
  658. begin
  659.   Result := TADOConnection(Item).ConnectionString = '';
  660. end;
  661.  
  662. function TADOConnectionSprig.Caption: string;
  663. begin
  664.   Result := CaptionFor(TADOConnection(Item).Provider, UniqueName);
  665. end;
  666.  
  667. { TADOImpliedConnectionSprig }
  668.  
  669. function TADOImpliedConnectionSprig.AnyProblems: Boolean;
  670. begin
  671.   Result := FConnectionString = '';
  672. end;
  673.  
  674. function TADOImpliedConnectionSprig.Caption: string;
  675. begin
  676.   Result := CaptionFor(FConnectionString, 'Implied ADO Connection'); { Do not localize }
  677. end;
  678.  
  679. function TADOImpliedConnectionSprig.UniqueName: string;
  680. begin
  681.   Result := SprigADOImpliedConnectionName(FConnectionString);
  682. end;
  683.  
  684. function TADOImpliedConnectionSprig.Transient: Boolean;
  685. begin
  686.   Result := True;
  687. end;
  688.  
  689. function TADOImpliedConnectionSprig.ItemClass: TClass;
  690. begin
  691.   Result := TADOConnection;
  692. end;
  693.  
  694. { ADO connection/connectionstring support }
  695.  
  696. function ADOConAnyProblems(AConnection: TADOConnection; const AConnectionString: WideString): Boolean;
  697. begin
  698.   Result := (AConnection = nil) and
  699.             (AConnectionString = '');
  700. end;
  701.  
  702. function ADOConDropOver(AParent: TSprig; var AConnection: TADOConnection; var AConnectionString: WideString): Boolean;
  703. begin
  704.   Result := False;
  705.   if AParent is TADOConnectionSprig then
  706.   begin
  707.     Result := TADOConnection(AParent.Item) <> AConnection;
  708.     if Result then
  709.       AConnection := TADOConnection(AParent.Item);
  710.   end
  711.   else if AParent is TADOImpliedConnectionSprig then
  712.   begin
  713.     Result := AConnectionString <> TADOImpliedConnectionSprig(AParent).FConnectionString;
  714.     if Result then
  715.       AConnectionString := TADOImpliedConnectionSprig(AParent).FConnectionString;
  716.   end;
  717. end;
  718.  
  719. function ADOConDragOver(AItem: TSprig): Boolean;
  720. begin
  721.   Result := (AItem is TADOConnectionSprig) or
  722.             (AItem is TADOImpliedConnectionSprig);
  723. end;
  724.  
  725. function ADOConFigureParent(ASprig: TSprig; AConnection: TADOConnection; const AConnectionString: WideString): Boolean;
  726. var
  727.   vConnection: TSprig;
  728. begin
  729.   // assume failure
  730.   vConnection := nil;
  731.  
  732.   // if connection is not nil then look for it
  733.   if AConnection <> nil then
  734.     vConnection := ASprig.Root.Find(AConnection, False);
  735.  
  736.   // else if connection string is not nil then look for it
  737.   if vConnection = nil then
  738.   begin
  739.     vConnection := ASprig.Root.Find(SprigADOImpliedConnectionName(AConnectionString), False);
  740.  
  741.     // if connection string cannot be found then make one
  742.     if vConnection = nil then
  743.     begin
  744.       vConnection := ASprig.Root.Add(TADOImpliedConnectionSprig.Create(nil));
  745.       TADOImpliedConnectionSprig(vConnection).FConnectionString := AConnectionString;
  746.     end;
  747.   end;
  748.  
  749.   // use the parent
  750.   vConnection.Add(ASprig);
  751. end;
  752.  
  753. { TADOCommandSprig }
  754.  
  755. function TADOCommandSprig.AnyProblems: Boolean;
  756. begin
  757.   with TADOCommand(Item) do
  758.     Result := ADOConAnyProblems(Connection, ConnectionString);
  759. end;
  760.  
  761. function TADOCommandSprig.Caption: string;
  762. var
  763.   vPrefix: string;
  764. begin
  765.   with TADOCommand(Item) do
  766.   begin
  767.     vPrefix := cCommandTypes[CommandType];
  768.     if CommandText <> '' then
  769.       vPrefix := vPrefix + ' ' + CommandText;
  770.     Result := CaptionFor(vPrefix, UniqueName);
  771.   end;
  772. end;
  773.  
  774. function TADOCommandSprig.DragDropTo(AItem: TSprig): Boolean;
  775. var
  776.   vConnection: TADOConnection;
  777.   vConnectionString: WideString;
  778. begin
  779.   with TADOCommand(Item) do
  780.   begin
  781.     vConnection := Connection;
  782.     vConnectionString := ConnectionString;
  783.     Result := ADOConDropOver(AItem, vConnection, vConnectionString);
  784.     if Result then
  785.     begin
  786.       Connection := vConnection;
  787.       ConnectionString := vConnectionString;
  788.     end;
  789.   end;
  790. end;
  791.  
  792. function TADOCommandSprig.DragOverTo(AItem: TSprig): Boolean;
  793. begin
  794.   Result := ADOConDragOver(AItem);
  795. end;
  796.  
  797. procedure TADOCommandSprig.FigureParent;
  798. begin
  799.   ADOConFigureParent(Self, TADOCommand(Item).Connection,
  800.                            TADOCommand(Item).ConnectionString);
  801. end;
  802.  
  803. class function TADOCommandSprig.PaletteOverTo(AParent: TSprig;
  804.   AClass: TClass): Boolean;
  805. begin
  806.   Result := ADOConDragOver(AParent);
  807. end;
  808.  
  809. { TCustomAdoDataSetSprig }
  810.  
  811. function TCustomADODataSetSprig.AnyProblems: Boolean;
  812. begin
  813.   with TCustomADODataSet(Item) do
  814.     Result := (DataSetField = nil) and
  815.               ADOConAnyProblems(Connection, ConnectionString);
  816. end;
  817.  
  818. procedure TCustomADODataSetSprig.FigureParent;
  819. begin
  820.   with TCustomADODataSet(Item) do
  821.     if DataSetField <> nil then
  822.       SeekParent(DataSetField).Add(Self)
  823.     else
  824.       ADOConFigureParent(Self, Connection, ConnectionString);
  825. end;
  826.  
  827. function TCustomADODataSetSprig.DragDropTo(AItem: TSprig): Boolean;
  828. var
  829.   vConnection: TADOConnection;
  830.   vConnectionString: WideString;
  831. begin
  832.   with TCustomADODataSet(Item) do
  833.     if AItem is TFieldSprig then
  834.     begin
  835.       Result := DataSetField <> AItem.Item;
  836.       if Result then
  837.         DataSetField := TDataSetField(AItem.Item);
  838.       Connection := nil;
  839.       ConnectionString := '';
  840.     end
  841.     else
  842.     begin
  843.       vConnection := Connection;
  844.       vConnectionString := ConnectionString;
  845.       Result := ADOConDropOver(AItem, vConnection, vConnectionString);
  846.       if Result then
  847.       begin
  848.         Connection := vConnection;
  849.         ConnectionString := vConnectionString;
  850.       end;
  851.       DataSetField := nil;
  852.     end;
  853. end;
  854.  
  855. function TCustomADODataSetSprig.DragOverTo(AItem: TSprig): Boolean;
  856. begin
  857.   Result := ((AItem is TFieldSprig) and
  858.              (TFieldSprig(AItem).Item is TDataSetField)) or
  859.             ADOConDragOver(AItem);
  860. end;
  861.  
  862. class function TCustomADODataSetSprig.PaletteOverTo(AParent: TSprig;
  863.   AClass: TClass): Boolean;
  864. begin
  865.   Result := ((AParent is TFieldSprig) and
  866.              (TFieldSprig(AParent).Item is TDataSetField)) or
  867.             ADOConDragOver(AParent);
  868. end;
  869.  
  870. { TADODataSetSprig }
  871.  
  872. function TADODataSetSprig.AnyProblems: Boolean;
  873. begin
  874.   Result := ((TADODataSet(Item).RDSConnection = nil) and
  875.              inherited AnyProblems) or
  876.             (TADODataSet(Item).CommandText = '');
  877. end;
  878.  
  879. function TADODataSetSprig.Caption: string;
  880. var
  881.   vPrefix: string;
  882. begin
  883.   with TADODataSet(Item) do
  884.   begin
  885.     vPrefix := cCommandTypes[CommandType];
  886.     if CommandText <> '' then
  887.       vPrefix := vPrefix + ' ' + CommandText;
  888.     Result := CaptionFor(vPrefix, UniqueName);
  889.   end;
  890. end;
  891.  
  892. function TADODataSetSprig.DragDropTo(AItem: TSprig): Boolean;
  893. begin
  894.   with TADODataSet(Item) do
  895.     if AItem is TRDSConnectionSprig then
  896.     begin
  897.       Result := RDSConnection <> AItem.Item;
  898.       if Result then
  899.         RDSConnection := TRDSConnection(AItem.Item);
  900.     end
  901.     else
  902.       Result := inherited DragDropTo(AItem);
  903. end;
  904.  
  905. function TADODataSetSprig.DragOverTo(AItem: TSprig): Boolean;
  906. begin
  907.   Result := (AItem is TRDSConnectionSprig) or
  908.             inherited DragOverTo(AItem);
  909. end;
  910.  
  911. procedure TADODataSetSprig.FigureParent;
  912. begin
  913.   with TADODataSet(Item) do
  914.     if RDSConnection <> nil then
  915.       SeekParent(RDSConnection).Add(Self)
  916.     else
  917.       inherited;
  918. end;
  919.  
  920. class function TADODataSetSprig.PaletteOverTo(AParent: TSprig;
  921.   AClass: TClass): Boolean;
  922. begin
  923.   Result := (AParent is TRDSConnectionSprig) or
  924.             inherited PaletteOverTo(AParent, AClass);
  925. end;
  926.  
  927. { TADOTableSprig }
  928.  
  929. function TADOTableSprig.AnyProblems: Boolean;
  930. begin
  931.   Result := TADOTable(Item).TableName = '';
  932. end;
  933.  
  934. function TADOTableSprig.Caption: string;
  935. begin
  936.   Result := CaptionFor(TADOTable(Item).TableName, UniqueName);
  937. end;
  938.  
  939. { TADOStoredProcSprig }
  940.  
  941. function TADOStoredProcSprig.AnyProblems: Boolean;
  942. begin
  943.   Result := TADOStoredProc(Item).ProcedureName = '';
  944. end;
  945.  
  946. function TADOStoredProcSprig.Caption: string;
  947. begin
  948.   Result := CaptionFor(TADOStoredProc(Item).ProcedureName, UniqueName);
  949. end;
  950.  
  951. { TADOQuerySprig }
  952.  
  953. function TADOQuerySprig.AnyProblems: Boolean;
  954. begin
  955.   Result := TADOQuery(Item).SQL.Text = '';
  956. end;
  957.  
  958. { TCustomADODataSetMasterDetailBridge }
  959.  
  960. class function TCustomADODataSetMasterDetailBridge.GetOmegaSource(
  961.   AItem: TPersistent): TDataSource;
  962. begin
  963.   Result := TADODataSet(AItem).DataSource;
  964. end;
  965.  
  966. class procedure TCustomADODataSetMasterDetailBridge.SetOmegaSource(
  967.   AItem: TPersistent; ADataSource: TDataSource);
  968. begin
  969.   TADODataSet(AItem).DataSource := ADataSource;
  970. end;
  971.  
  972. type
  973.   TCustomADODataSetHack = class(TCustomADODataSet)
  974.   end;
  975.  
  976. function TCustomADODataSetMasterDetailBridge.Caption: string;
  977. begin
  978.   Result := SNoMasterFields;
  979.   if TCustomADODataSetHack(Omega.Item).CommandType = cmdText then
  980.     Result := SParamsFields
  981.   else if TCustomADODataSetHack(Omega.Item).MasterFields <> '' then
  982.     Result := TCustomADODataSetHack(Omega.Item).MasterFields;
  983. end;
  984.  
  985. { TADODataSetMasterDetailBridge }
  986.  
  987. function TADODataSetMasterDetailBridge.CanEdit: Boolean;
  988. begin
  989.   Result := TADODataSet(Omega.Item).CommandType <> cmdText;
  990. end;
  991.  
  992. function TADODataSetMasterDetailBridge.Edit: Boolean;
  993. var
  994.   vPropEd: TADODataSetFieldLinkProperty;
  995. begin
  996.   Result := False;
  997.   if TADODataSet(Omega.Item).CommandType <> cmdText then
  998.   begin
  999.     vPropEd := TADODataSetFieldLinkProperty.CreateWith(TADODataSet(Omega.Item));
  1000.     try
  1001.       vPropEd.Edit;
  1002.       Result := vPropEd.Changed;
  1003.     finally
  1004.       vPropEd.Free;
  1005.     end;
  1006.   end;
  1007. end;
  1008.  
  1009. class function TADODataSetMasterDetailBridge.OmegaIslandClass: TIslandClass;
  1010. begin
  1011.   Result := TADODataSetIsland;
  1012. end;
  1013.  
  1014. { TADOTableMasterDetailBridge }
  1015.  
  1016. function TADOTableMasterDetailBridge.CanEdit: Boolean;
  1017. begin
  1018.   Result := True;
  1019. end;
  1020.  
  1021. function TADOTableMasterDetailBridge.Edit: Boolean;
  1022. var
  1023.   vPropEd: TADOTableFieldLinkProperty;
  1024. begin
  1025.   vPropEd := TADOTableFieldLinkProperty.CreateWith(TADOTable(Omega.Item));
  1026.   try
  1027.     vPropEd.Edit;
  1028.     Result := vPropEd.Changed;
  1029.   finally
  1030.     vPropEd.Free;
  1031.   end;
  1032. end;
  1033.  
  1034. class function TADOTableMasterDetailBridge.OmegaIslandClass: TIslandClass;
  1035. begin
  1036.   Result := TADOTableIsland;
  1037. end;
  1038.  
  1039. { TADOQueryMasterDetailBridge }
  1040.  
  1041. class function TADOQueryMasterDetailBridge.OmegaIslandClass: TIslandClass;
  1042. begin
  1043.   Result := TADOQueryIsland;
  1044. end;
  1045.  
  1046. { TADOCommandIsland }
  1047.  
  1048. function TADOCommandIsland.VisibleTreeParent: Boolean;
  1049. begin
  1050.   Result := False;
  1051. end;
  1052.  
  1053. { TCustomADODataSetIsland }
  1054.  
  1055. function TCustomADODataSetIsland.VisibleTreeParent: Boolean;
  1056. begin
  1057.   Result := False;
  1058. end;
  1059.  
  1060. procedure Register;
  1061. begin
  1062.   RegisterComponents(srADO, [TADOConnection, TADOCommand, TADODataSet,
  1063.     TADOTable, TADOQuery, TADOStoredProc, TRDSConnection]);
  1064.   RegisterPropertyEditor(TypeInfo(WideString), TADOConnection, 'Provider', TProviderProperty);
  1065.   RegisterPropertyEditor(TypeInfo(WideString), TADOConnection, 'ConnectionString', TConnectionStringProperty);
  1066.   RegisterPropertyEditor(TypeInfo(WideString), TADOCommand, 'ConnectionString', TConnectionStringProperty);
  1067.   RegisterPropertyEditor(TypeInfo(WideString), TCustomADODataSet, 'ConnectionString', TConnectionStringProperty);
  1068.   RegisterPropertyEditor(TypeInfo(WideString), TADODataSet, 'CommandText', TCommandTextProperty);
  1069.   RegisterPropertyEditor(TypeInfo(WideString), TADOCommand, 'CommandText', TCommandTextProperty);
  1070.   RegisterPropertyEditor(TypeInfo(WideString), TADOTable, 'TableName', TTableNameProperty);
  1071.   RegisterPropertyEditor(TypeInfo(WideString), TADOStoredProc, 'ProcedureName', TProcedureNameProperty);
  1072.   RegisterPropertyEditor(TypeInfo(TParameters), TCustomADODataSet, 'Parameters', TParametersProperty);
  1073.   RegisterPropertyEditor(TypeInfo(TParameters), TADOCommand, 'Parameters', TParametersProperty);
  1074.   RegisterPropertyEditor(TypeInfo(string), TCustomADODataSet, 'IndexName', TADOIndexNameProperty);
  1075.   RegisterComponentEditor(TADOConnection, TADOConnectionEditor);
  1076.   RegisterComponentEditor(TADOCommand, TADOCommandEditor);
  1077.   RegisterComponentEditor(TADODataSet, TADODataSetEditor);
  1078.  
  1079.   RegisterPropertyEditor(TypeInfo(string), TADODataSet, 'MasterFields', TADODataSetFieldLinkProperty);
  1080.   RegisterPropertyEditor(TypeInfo(string), TADOTable, 'MasterFields', TADOTableFieldLinkProperty);
  1081.  
  1082.   RegisterPropertiesInCategory(TDatabaseCategory, TADOConnection,
  1083.       ['Attributes','Command*','Connect*','DefaultDatabase','IsolationLevel',
  1084.        'LoginPrompt','Mode','Provider']);
  1085.  
  1086.   RegisterPropertiesInCategory(TDatabaseCategory, TADOCommand,
  1087.       ['Command*','Connect*','Cursor*','ExecuteOptions','Param*','Prepared']);
  1088.  
  1089.   RegisterPropertiesInCategory(TDatabaseCategory, TCustomADODataSet,
  1090.       ['CacheSize', 'ConnectionString', 'ExecuteOptions', 'MarshalOptions',
  1091.        'MaxRecords', 'Prepared', 'ProcedureName', 'Command*']);
  1092.  
  1093.   RegisterSprigType(TADOConnection, TADOConnectionSprig);
  1094.   RegisterSprigType(TRDSConnection, TRDSConnectionSprig);
  1095.   RegisterSprigType(TADOCommand, TADOCommandSprig);
  1096.  
  1097.   RegisterSprigType(TCustomADODataSet, TCustomADODataSetSprig);
  1098.   RegisterSprigType(TADODataSet, TADODataSetSprig);
  1099.   RegisterSprigType(TADOTable, TADOTableSprig);
  1100.   RegisterSprigType(TADOStoredProc, TADOStoredProcSprig);
  1101.   RegisterSprigType(TADOQuery, TADOQuerySprig);
  1102.  
  1103.   RegisterIslandType(TADOCommandSprig, TADOCommandIsland);
  1104.   RegisterIslandType(TCustomADODataSetSprig, TCustomADODataSetIsland);
  1105.   RegisterIslandType(TADODataSetSprig, TADODataSetIsland);
  1106.   RegisterIslandType(TADOTableSprig, TADOTableIsland);
  1107.   RegisterIslandType(TADOQuerySprig, TADOQueryIsland);
  1108.  
  1109.   RegisterBridgeType(TDataSetIsland, TADODataSetIsland, TADODataSetMasterDetailBridge);
  1110.   RegisterBridgeType(TDataSetIsland, TADOTableIsland, TADOTableMasterDetailBridge);
  1111.   RegisterBridgeType(TDataSetIsland, TADOQueryIsland, TADOQueryMasterDetailBridge);
  1112. end;
  1113.  
  1114. end.
  1115.